/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ndj.daoimpl;


import br.com.ndj.conexao.FabricaConexao;
import br.com.ndj.dao.UsuarioDAO;
import br.com.ndj.domain.Usuario;
import br.com.ndj.exceptions.FabricaConexaoPoolVazioException;
import br.com.ndj.exceptions.UsuarioDAOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Osmar Vilarim
 * 17/09/2014
 */

public class UsuarioDAOImpl implements UsuarioDAO {
    
    private Connection conn = null;
    private String sql = "";
    private PreparedStatement pstmt = null;
    private List<Usuario> listUsuario = new ArrayList<Usuario>();
    
    
    public UsuarioDAOImpl() {
        try {
            //conn = new FabricaConexao().abrirConexao();
            conn = FabricaConexao.getInstance().getConnectionFromPool();
        } catch (FabricaConexaoPoolVazioException ex) {
            //Logger.getLogger(LoginDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public boolean cadastrarUsuario(Usuario usuario) throws UsuarioDAOException{
        boolean retorno = false;

        if (usuario != null) {

            try {

                conn.setAutoCommit(false);
                sql = "INSERT INTO USU_USUARIO (USU_LOGIN, USU_NOME, USU_SENHA, USU_FONE, USU_EMAIL, USU_STATUS) VALUES (?,?,?,?,?,?)";
                pstmt = conn.prepareStatement(sql);

                pstmt.setString(1, usuario.getUsuLogin().trim());
                pstmt.setString(2, usuario.getUsuNome().trim());
                pstmt.setString(3, usuario.getUsuSenha().trim());
                pstmt.setString(4, usuario.getUsuFone().trim());
                pstmt.setString(5, usuario.getUsuEmail().trim());
                pstmt.setString(6, "ATIVO");
                int rows = pstmt.executeUpdate();

                if (rows > 0) {
                    System.out.println("Quantidade de linhas inseridas no banco: " + rows);
                }
                conn.commit();
                pstmt.close();

                retorno = true;
            } catch (SQLException e) {

                try {
                    conn.rollback();
                } catch (SQLException x) {
                    throw new UsuarioDAOException(UsuarioDAOException.ERRO_INSERIR_USUARIO, null);
                }

                throw new UsuarioDAOException(UsuarioDAOException.ERRO_INSERIR_USUARIO, null);
            } finally {
                FabricaConexao.getInstance().returnConnectionToPool(conn);
            }

        }

        return retorno;
    }

    @Override
    public boolean editarUsuario(Usuario usuario) throws UsuarioDAOException {
         boolean retorno = false;

        if (usuario != null) {

            try {
                conn.setAutoCommit(false);
                sql = "";
                sql = "UPDATE usu_usuario SET USU_LOGIN = ?, USU_NOME = ?, USU_SENHA = ?, USU_FONE = ?, USU_EMAIL = ?, USU_STATUS = ? WHERE USU_IDENTIFICADOR = ?";

                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1, usuario.getUsuLogin());
                pstmt.setString(2, usuario.getUsuNome());
                pstmt.setString(3, usuario.getUsuSenha());
                pstmt.setString(4, usuario.getUsuFone());
                pstmt.setString(5, usuario.getUsuEmail());
                pstmt.setString(6, usuario.getUsuStatus());
                pstmt.setInt(7, usuario.getUsuIdentificador());

                int rows = pstmt.executeUpdate();

                if (rows > 0) {
                    System.out.println("Quantidade de linhas inseridas no banco: " + rows);
                    retorno = true;
                }
                conn.commit();
                pstmt.close();

            } catch (SQLException ex) {
                
                try {
                    conn.rollback();
                } catch (SQLException e1) {
                    throw new UsuarioDAOException(UsuarioDAOException.ERRO_ALTERAR_USUARIO, null);
                }
                
                throw new UsuarioDAOException(UsuarioDAOException.ERRO_ALTERAR_USUARIO, null);

            } finally {
                FabricaConexao.getInstance().returnConnectionToPool(conn);
            }
        }
        return retorno;
    }

    @Override
    public boolean excluirUsuario(Usuario usuario) throws UsuarioDAOException {
        boolean retorno = false;

        try {

            if (usuario.getUsuIdentificador()!= 0) {
                sql = "DELETE FROM usu_usuario where USU_IDENTIFICADOR = ?";
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, usuario.getUsuIdentificador());
            }

        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        try {

            conn.setAutoCommit(false);

            int rows = pstmt.executeUpdate();

            if (rows > 0) {
                System.out.println("Quantidade de linhas excluídas no banco: " + rows);
            }
            conn.commit();
            pstmt.close();

            retorno = true;
        } catch (SQLException e) {

            try {
                conn.rollback();
            } catch (SQLException e1) {
                throw new UsuarioDAOException(UsuarioDAOException.ERRO_EXCLUIR_USUARIO, null);
            }

            throw new UsuarioDAOException(UsuarioDAOException.ERRO_EXCLUIR_USUARIO, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return retorno;
    }

    @Override
    public List<Usuario> listarUsuario() throws UsuarioDAOException {
        listUsuario = new ArrayList<Usuario>();
        
        try {
            sql = "SELECT DISTINCT USU_IDENTIFICADOR,USU_LOGIN,USU_NOME,USU_SENHA,USU_FONE,USU_EMAIL,USU_STATUS FROM usu_usuario";
            pstmt = conn.prepareStatement(sql);

            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                
                Usuario usuario = new Usuario();
                
                usuario.setUsuIdentificador(rs.getInt("USU_IDENTIFICADOR"));
                usuario.setUsuLogin(rs.getString("USU_LOGIN"));
                usuario.setUsuNome(rs.getString("USU_NOME"));
                usuario.setUsuSenha(rs.getString("USU_SENHA"));
                usuario.setUsuFone(rs.getString("USU_FONE"));
                usuario.setUsuEmail(rs.getString("USU_EMAIL"));
                usuario.setUsuStatus(rs.getString("USU_STATUS"));
                
                
                this.listUsuario.add(usuario);

            }//fim while

            pstmt.close();

        } catch (SQLException e) {
            throw new UsuarioDAOException(UsuarioDAOException.ERRO_LISTAR_USUARIO, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return this.listUsuario;
    }

    @Override
    public List<Usuario> listarUsuario(Usuario usuario) throws UsuarioDAOException {
        listUsuario = new ArrayList<Usuario>();
        
        try {

            sql = "SELECT USU_IDENTIFICADOR,USU_LOGIN,USU_NOME,USU_SENHA,USU_FONE,USU_EMAIL,USU_STATUS FROM usu_usuario where USU_NOME like ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "%"+usuario.getUsuNome()+"%");

            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                
                usuario = new Usuario();
                
                usuario.setUsuIdentificador(rs.getInt("USU_IDENTIFICADOR"));
                usuario.setUsuLogin(rs.getString("USU_LOGIN"));
                usuario.setUsuNome(rs.getString("USU_NOME"));
                usuario.setUsuSenha(rs.getString("USU_SENHA"));
                usuario.setUsuFone(rs.getString("USU_FONE"));
                usuario.setUsuEmail(rs.getString("USU_EMAIL"));
                usuario.setUsuStatus(rs.getString("USU_STATUS"));
                                
                this.listUsuario.add(usuario);

            }//fim while

            pstmt.close();

        } catch (SQLException e) {
            throw new UsuarioDAOException(UsuarioDAOException.ERRO_LISTAR_USUARIO, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return this.listUsuario;
    }
    
    
    
}
